import cv2                         # OpenCV，用于图像处理
import numpy as np                  # NumPy，用于科学计算
from skimage import io,img_as_float,color,exposure,feature # skimage的io和img_as_float，用于图像读取和转换
from tensorflow.keras.preprocessing.image import  img_to_array,load_img
from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input

#传统图像展平
# def preprocess_image(file_name, new_size):
#     """
#     预处理图像：读取图像，调整大小，并展平为一维数组
#     """
#     # 以灰度模式读取图像，并将图像转为浮点类型
#     img = img_as_float(io.imread(file_name, as_gray=True))
#      #调整图像大小
#     img = cv2.resize(img, new_size)
#      #将图像展平为一维数组
#     img = img.ravel()
#
#     return img

#HOG特征提取
def preprocess_image(file_name, new_size):
    """
        预处理图像：读取图像，调整大小，提取特征
    """
    # 加载图片并将其转化为灰度图，因为HOG特征只对灰度图有效
    img = img_as_float(io.imread(file_name, as_gray=True))

    # 调整图像大小
    img = cv2.resize(img, new_size)

    # 灰度图像提取特征，不用再进行额外的展平操作，已经是一维数组
    img = feature.hog(img, orientations=9, pixels_per_cell=(16, 16), cells_per_block=(2, 2))

    return img

#CNN模型VGG16特征提取
# def preprocess_image(file_name, new_size):
#      """
#      预处理图像：读取图像，调整大小，并将其转换为VGG16模型的输入格式
#      """
#      # 加载图像并调整大小
#      img = load_img(file_name, target_size=new_size)
#
#      # 将图像转换为Numpy数组
#      img = img_to_array(img)
#      X = np.array([img])
#
#      # 对图像进行预处理以适合VGG16模型
#      img_preprocessed = preprocess_input(X)
#
#      # 调用VGG16模型并加载预训练权重
#      model = VGG16(weights='imagenet', include_top=False,pooling="max")
#
#      # 使用VGG16模型对图像进行特征提取
#      features = model.predict(img_preprocessed)
#
#      return features.flatten()#返回一维